package anonymus.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import anonymus.excepcion.DAOExcepcion;
import anonymus.modelo.Cancha;
import anonymus.modelo.Local;
import anonymus.util.ConexionBD;


public class canchaDAO extends BaseDAO{

	public Collection<Cancha> buscarCancha(String distrito, String dia, String horaInicio, String horaFin) throws DAOExcepcion {
		System.out.println("canchaDAO: buscarCancha(String distrito, String dia, String horaInicio, String horaFin)");
		String query = "select l.nombreLoc,l.distrito,h.dia,h.horainicio,h.horafin," +
				"a.cancha_has_horario_cancha_codCancha,c.codCancha, c.local_codLocal, c.nombreCancha, " +
				"c.caracteristicasCancha, c.foto from cancha c " +
				"left join local l on l.codLocal=c.local_codLocal " +
				"left join cancha_has_horario  ch on ch.cancha_codCancha=c.codCancha " +
				"left join horario h on h.codHorario=ch.horario_codHorario " +
				"left join alquiler a on a.cancha_has_horario_cancha_codCancha=c.codCancha " +
						"and a.cancha_has_horario_horario_codHorario=h.codHorario " +
				"where l.distrito Like ?  and h.dia like ? and h.horaInicio like ? and h.horaFin like ?";
		Collection<Cancha> lista = new ArrayList<Cancha>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + distrito + "%");
			stmt.setString(2, "%" + dia + "%");
			stmt.setString(3, "%" + horaInicio + "%");
			stmt.setString(4, "%" + horaFin + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cancha vo = new Cancha();
				vo.setCodCancha(rs.getInt("codCancha"));
				vo.setNombreCancha(rs.getString("nombreCancha"));
				vo.setCaracteristicasCancha(rs.getString("caracteristicasCancha"));
				vo.setFoto(rs.getString("foto"));
			
////////////////////////////////////////////////////////////////////////////////////////////				
				vo.setFecha(rs.getString("dia"));
				vo.setInicio(rs.getString("horaInicio"));
				vo.setFin(rs.getString("horaFin"));
				
				vo.setDisponible(rs.getString("cancha_has_horario_cancha_codCancha"));
				
				if(vo.getDisponible() !=null){
					vo.setDisponible("NO");
				}
				else{
					vo.setDisponible("SI");
				}
				
////////////////////////////////////////////////////////////////////////////////////////////				
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public Collection<Cancha> buscarAlquilerCancha(int codLocal, String diaInicio, String diaFin) throws DAOExcepcion {
		System.out.println("canchaDAO: buscarAlquilerCancha(String nombreLoc, String diaInicio, String diaFin)");
		String query = "select l.nombreLoc,l.distrito,h.dia,h.horainicio,h.horafin," +
				"a.cancha_has_horario_cancha_codCancha,c.codCancha, c.local_codLocal,c.nombreCancha, " +
				"c.caracteristicasCancha, c.foto from cancha c " +
				"left join local l on l.codLocal=c.local_codLocal " +
				"left join cancha_has_horario  ch on ch.cancha_codCancha=c.codCancha " +
				"left join horario h on h.codHorario=ch.horario_codHorario " +
				"left join alquiler a on a.cancha_has_horario_cancha_codCancha=c.codCancha " +
						"and a.cancha_has_horario_horario_codHorario=h.codHorario " +
				"where c.local_codLocal like ? and a.cancha_has_horario_cancha_codCancha is not null " +
						"and (h.dia like ? or h.dia like ?)";
		Collection<Cancha> lista = new ArrayList<Cancha>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + codLocal + "%");
			stmt.setString(2, "%" + diaInicio + "%");
			stmt.setString(3, "%" + diaFin + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cancha vo = new Cancha();
				vo.setCodCancha(rs.getInt("codCancha"));
				vo.setNombreCancha(rs.getString("nombreCancha"));
				vo.setCaracteristicasCancha(rs.getString("caracteristicasCancha"));
				vo.setFoto(rs.getString("foto"));
				
////////////////////////////////////////////////////////////////////////////////////////////
				vo.setNombreLocal(rs.getString("nombreLoc"));
				vo.setFecha(rs.getString("dia"));
				vo.setInicio(rs.getString("horaInicio"));
				vo.setFin(rs.getString("horaFin"));
////////////////////////////////////////////////////////////////////////////////////////////
				
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}


		
	public void insertar(Cancha vo) throws DAOExcepcion {
			System.out.println("canchaDAO: insertar(Cancha vo)");
			String query = "INSERT INTO Cancha(nombreCancha, caracteristicasCancha, foto, local_codLocal ) VALUES (?,?,?,?)";
			Connection con = null;
			PreparedStatement stmt = null;
			try {
				con = ConexionBD.obtenerConexion();
				String query2 = "select local_codLocal, nombreCancha from Cancha where local_codLocal = ? AND nombreCancha = ?";
				stmt = con.prepareStatement(query2);
				stmt.setInt(1, vo.getLocal().getCodLocal());
				stmt.setString(2, vo.getNombreCancha());
				ResultSet rs;
				rs = stmt.executeQuery();
				if (rs != null && rs.next()) 
				{
					System.out.println("REGISTRO YA EXISTE");
					throw new DAOExcepcion("REGISTRO YA EXISTE");
				}
				else
				{
				stmt = con.prepareStatement(query);
				stmt.setString(1, vo.getNombreCancha());
				stmt.setString(2, vo.getCaracteristicasCancha());				
				stmt.setString(3, vo.getFoto());
				stmt.setInt(4, vo.getLocal().getCodLocal());
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("Que penita, no se pudo insertar jaaa");
				}
				//ULTIMO CODIGO AUTOGENERADO CREADO
				System.out.println("OK INSERTADO. Obteniendo codigo Autogenerado de Cancha");
				int idp = 0;
                query = "SELECT LAST_INSERT_ID()";
                stmt = con.prepareStatement(query);
                rs = stmt.executeQuery();
                if (rs.next()) {
                        idp = rs.getInt(1);
                }
                vo.setCodCancha(idp);
                
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
		}

		public Collection<Cancha> obtener() throws DAOExcepcion {
			  String query = "SELECT codCancha, nombreCancha FROM Cancha" ;
              Collection<Cancha> lista = new ArrayList<Cancha>();
              Connection con = null;
              PreparedStatement stmt = null;
              ResultSet rs = null;
              try {
                      con = ConexionBD.obtenerConexion();
                      stmt = con.prepareStatement(query);
                      rs = stmt.executeQuery();
                      while (rs.next()) {
                              Cancha vo = new Cancha();
                              vo.setCodCancha(rs.getInt("codCancha"));
                              vo.setNombreCancha(rs.getString("nombreCancha"));
                              lista.add(vo);
                      }
              } catch (SQLException e) {
                      System.err.println(e.getMessage());
                      throw new DAOExcepcion(e.getMessage());
              } finally {
                      //this.cerrarResultSet(rs);
                      //this.cerrarStatement(stmt);
                      //this.cerrarConexion(con);
              }
              return lista;
		}

		public void eliminar(String codCancha) throws DAOExcepcion {
			System.out.println("canchaDAO: eliminar(int codCancha)");
			String query = "DELETE FROM Cancha WHERE codCancha=?";
			Connection con = null;
			PreparedStatement stmt = null;
			try {
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, codCancha);
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("no se pudo eliminar");
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
		}

		public void actualizar(Cancha vo) throws DAOExcepcion {
			System.out.println("canchaDAO: actualizar(Cancha vo)");
			String query = "update Cancha set(nombreCancha, caracteristicasCancha, foto ) VALUES (?,?,?) where codCancha=?";
			Connection con = null;
			PreparedStatement stmt = null;
			try {
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, vo.getNombreCancha());
				stmt.setString(2, vo.getCaracteristicasCancha());
				stmt.setString(3, vo.getFoto());
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("no se pudo actualizar");
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
		}

		
        public Collection<Cancha> ListarCancha() throws DAOExcepcion {
            String query = "SELECT c.nombreCancha, c.caracteristicasCancha,h.dia, c.foto, a.cancha_has_horario_cancha_codCancha as 'Disponible' FROM cancha c left join cancha_has_horario  ch on c.codCancha=ch.cancha_codCancha left join horario h on h.codHorario=ch.horario_codHorario left join alquiler a on a.cancha_has_horario_cancha_codCancha=c.codCancha and a.cancha_has_horario_horario_codHorario=h.codHorario" ; 
            Collection<Cancha> lista = new ArrayList<Cancha>();
            Connection con = null;
            PreparedStatement stmt = null;
            ResultSet rs = null;
            try {
                    con = ConexionBD.obtenerConexion();
                    stmt = con.prepareStatement(query);
                    rs = stmt.executeQuery();
                    while (rs.next()) {
                            Cancha vo = new Cancha();
                            vo.setNombreCancha(rs.getString(""));
                            vo.setCaracteristicasCancha(rs.getString(""));
                            vo.setHorarios(rs.getString(""));
                            vo.setFoto(rs.getString(""));
                            vo.setCanchas(rs.getString(""));
                            lista.add(vo);
                    }
            } catch (SQLException e) {
                    System.err.println(e.getMessage());
                    throw new DAOExcepcion(e.getMessage());
            } finally {
                    //this.cerrarResultSet(rs);
                    //this.cerrarStatement(stmt);
                    //this.cerrarConexion(con);
            }
            return lista;
    }

        public Collection<Local> listarDistritos() throws DAOExcepcion {
            System.out.println("CanchaDAO: listarDistritos()");
            Collection<Local> c = new ArrayList<Local>();
            Connection con = null;
            PreparedStatement stmt = null;
            ResultSet rs = null;
            try {           
                    con = ConexionBD.obtenerConexion();
                    String query="Select distrito from local group by distrito";
                    stmt = con.prepareStatement(query);
                    rs = stmt.executeQuery();
                    while (rs.next()) {
                            Local vo = new Local();                         
                            vo.setDistrito(rs.getString("distrito"));                           
                            c.add(vo);
                    }
            } catch (SQLException e) {
                    System.err.println(e.getMessage());
                    throw new DAOExcepcion(e.getMessage());
            } finally {
                    this.cerrarResultSet(rs);
                    this.cerrarStatement(stmt);
                    this.cerrarConexion(con);
            }
            return c;
    }
	}

